// 初始化烟花的弹药运动
function Ammunition(myx1, myy1, myx2, myy2, getrandom, Distance) {
  // 发射坐标-开始
  this.myx1 = myx1
  this.myy1 = myy1
  // 过程坐标-动态
  this.movingx = myx1
  this.movingy = myy1
  // 爆炸坐标-结束
  this.myx2 = myx2
  this.myy2 = myy2
  // 创建多个坐标位置集合
  this.position = Array()
  this.positionNum = 3 // 位置数配合push向数组添加元素
  while (this.positionNum--) {
      this.position.push([this.movingx, this.movingy])
  }
  // 获取烟花运行角度
  this.angle = Math.atan2(myy2 - myy1, myx2 - myx1) // 表示点(y, x)对应的偏移角度
  this.allDistance = Distance(this.myx1, this.myy1, this.myx2, this.myy2) // 发射-爆炸总路程
  this.leaveDistance = 0 // 初始离开距离为0
  // 设置烟花越来越快速度
  this.speed = 2
  this.Variety = 1.06 // 变化
  this.light = getrandom(20, 50) // 20~50的亮度
}
// 弹药发射-运动-爆炸过程运动的实现
Ammunition.prototype.achieve = function(a, color, ammunitions, setcanvas, Distance, createMore) {
  // 在弹药数组开头添加新的位置并删除弹药数组中的最后一项
  this.position.pop()
  this.position.unshift([this.movingx, this.movingy])
  // 设置烟花越来越快速度
  this.speed *= this.Variety
  var speedx = Math.cos(this.angle) * this.speed
  var speedy = Math.sin(this.angle) * this.speed
  // 发射后离开的距离
  this.leaveDistance = Distance(this.myx1, this.myy1, this.movingx + speedx, this.movingy + speedy)
  // 离开的距离大于等于到目标的初始距离则已到达目标
  if (this.leaveDistance >= this.allDistance) {
      createMore(this.myx2, this.myy2) // 烟花绽放多个烟花粒子
      // 删除烟花,向(从)数组中添加(删除)项目,删除位置和删除数量两个参数，第三个参数是添加用的
      ammunitions.splice(a, 1)
  } else {
      // 未达到目标，继续前进
      this.movingx += speedx
      this.movingy += speedy
  }
  // 画出烟花炮弹的轨迹
  setcanvas.beginPath() // beginPath()开始一条路径，或重置当前的路径
  // moveTo(x,y)把路径移动到画布中的指定点,不创建线条
  setcanvas.moveTo(this.position[this.position.length - 1][0], this.position[this.position.length - 1][
  1])
  // lineTo(x,y)添加一个新点，然后在画布中创建从该点到最后指定点的线条,不会创建线条
  setcanvas.lineTo(this.movingx, this.movingy)
  // 设置轨迹的颜色,饱和度和亮度,HSL(H,S,L);
  setcanvas.strokeStyle = 'hsl(' + color + ',100%,' + this.light + '%)'
  setcanvas.stroke() // 绘制已定义的路径
}

// 初始化烟花粒子
function FireworksParticle(x, y, getrandom, color) {
  this.x = x
  this.y = y
  // 跟踪每个粒子的过去坐标以创建轨迹效果，增加坐标数以创建更突出的轨迹
  this.position = Array()
  this.positionNum = 6
  while (this.positionNum--) {
      this.position.push([this.x, this.y]) // push()方法可向数组的末尾添加一个或多个元素
  }
  // 设置烟花粒子随机运动角度
  this.angle = getrandom(0, Math.PI * 2)
  // 设置烟花粒子随机运行速度和速度逐渐减慢功能
  this.speed = getrandom(2, 9)
  this.slow = 0.9
  this.alpha = 1 // 透明度最开始不透明
  this.setAlpha = getrandom(0.01, 0.03) // 设置随机降低烟花粒子的透明度速率
  this.color = getrandom(color - 20, 40) // 动态颜色，设为(color-x,color-y)为动态彩色
  this.light = getrandom(30, 50) // 30~50的随机亮度
  this.count = 1
}
// 烟花中一个粒子出现效果的实现
FireworksParticle.prototype.achieve = function(a, setcanvas, color, mousedown, getrandom, fireworksParticles) {
  // 删除坐标数组中的最后一项
  this.position.pop()
  // 将当前坐标添加到数组的开头
  this.position.unshift([this.x, this.y])
  // 设置烟花粒子随机运行速度和速度逐渐减慢功能
  this.speed *= this.slow
  // 烟花粒子速度改变且一直是向下运动+1
  this.x += Math.cos(this.angle) * this.speed
  this.y += Math.sin(this.angle) * this.speed + 1
  if (mousedown) this.color = getrandom(color - 50, color + 100)
  // 淡出粒子
  this.alpha -= this.setAlpha
  // 当透明度足够低时删除对应粒子
  if (this.alpha <= this.setAlpha) {
      fireworksParticles.splice(a, 1)
  }
  // 画出烟花粒子
  setcanvas.beginPath()
  setcanvas.moveTo(this.position[this.position.length - 1][0], this.position[this.position.length - 1][
  1])
  setcanvas.lineTo(this.x, this.y)
  // hsla比hsl多一个alpha透明度参数
  setcanvas.strokeStyle = 'hsla(' + this.color + ', 100%, ' + this.light + '%, ' + this.alpha + ')'
  setcanvas.stroke()
}

export default {
  Ammunition,
  FireworksParticle
}
